<?php

declare(strict_types=1);

/**
 * Token验证中间件
 *
 * 本中间件用于检查请求中传递的 token 是否有效。
 * 使用 `96qbhy/hyperf-auth` 组件实现 token 的认证与验证。
 *
 * @package    Middleware
 * @subpackage Auth
 * @author     Your Name
 * @license    MIT License
 * @link       https://your-project-link.com
 */
namespace App\Kernel\Middleware;

use Hyperf\Di\Annotation\Inject;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\MiddlewareInterface;
use Psr\Http\Server\RequestHandlerInterface;
use Qbhy\HyperfAuth\AuthManager;
use Qbhy\HyperfAuth\Exception\UnauthorizedException;

class AuthMiddleware implements MiddlewareInterface
{
    #[Inject]
    protected AuthManager $authManager;

    /**
     * 处理传入的服务器请求。
     *
     * - 检查请求中的 token。
     * - 如果 token 有效，允许请求通过。
     * - 如果 token 无效，抛出 UnauthorizedException。
     *
     * @param ServerRequestInterface $request 传入的服务器请求。
     * @param RequestHandlerInterface $handler 请求处理器。
     *
     * @return ResponseInterface 响应实例。
     *
     * @throws UnauthorizedException 如果无法从 token 中提取出用户。
     */
    public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface
    {
        // 尝试从请求中获取token，并进行验证。
        // 使用默认的guard进行用户认证
        $guard = $this->authManager->guard();

        // 尝试从请求中获取用户
        $user = $guard->user();

        // 如果没有获取到用户，抛出未授权异常
        if (!$user) {
            throw new UnauthorizedException("Token无效或已过期");
        }

        // 如果 token 认证成功，则继续请求流程
        return $handler->handle($request);
    }
}
